package com.toonan.system.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import com.google.common.collect.Lists;
import com.toonan.core.constant.WebplusCons;
import com.toonan.core.matatype.Dto;
import com.toonan.core.util.WebplusMongo;
import com.toonan.core.util.WebplusUtil;
import com.toonan.core.vo.PageResult;
import com.toonan.core.vo.TreeModel;
import com.toonan.core.vo.UserToken;
import com.toonan.system.constant.SystemCons;
import com.toonan.system.dao.RoleDao;
import com.toonan.system.dao.RoleMenuDao;
import com.toonan.system.dao.RoleUserDao;
import com.toonan.system.model.Menu;
import com.toonan.system.model.Role;
import com.toonan.system.model.RoleMenu;
import com.toonan.system.model.RoleUser;
import com.toonan.system.util.SystemCache;

@Service
public class RoleService {
    
	@Autowired
	private RoleDao roleDao;
	
	@Autowired
	private RoleUserDao roleUserDao;
	@Autowired
	private RoleMenuDao roleMenuDao;
	
	 /**
     * 
     * 简要说明：分页查询键值参数信息
     * 编写者：陈骑元（chenqiyuan@toonan.com）
     * 创建时间： 2022年2月13日 上午11:01:55 
     * @param 说明
     * @return 说明
     */
    public PageResult findPage(Dto pDto) {
    	Query query=new Query();
    	WebplusMongo.like(query,"roleName", pDto);
    	WebplusMongo.eq(query,"roleType", pDto);
    	WebplusMongo.eq(query,"editMode", pDto);
    	WebplusMongo.eq(query,"status", pDto);
    	WebplusMongo.eq(query,"createBy", pDto);
    	WebplusMongo.withSortDesc(query, "createTime");
    	PageResult pageResult=new PageResult(pDto);
    	
        return roleDao.findPage(query, pageResult); 	
    }
	/**
	 * 
	 * 简要说明：保存一个角色
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月2日 下午10:21:34 
	 * @param 说明
	 * @return 说明
	 */
    public boolean insert(Role role) {
    	
    	Role roleDb=roleDao.insert(role);
    	if(WebplusUtil.isNotEmpty(roleDb.getRoleId())) {
    		return true;
    	}
    	return false;
    }
    /**
     * 
     * 简要说明：
     * 编写者：陈骑元（chenqiyuan@toonan.com）
     * 创建时间： 2022年3月2日 下午10:24:42 
     * @param 说明
     * @return 说明
     */
    public Role findById(String id){
    	
    	return this.roleDao.findById(id);
    }
    /**
     * 
     * 简要说明：
     * 编写者：陈骑元（chenqiyuan@toonan.com）
     * 创建时间： 2022年3月2日 下午10:28:40 
     * @param 说明
     * @return 说明
     */
    public boolean updateById(Role role) {
    	
    	return this.roleDao.updateById(role);
    }
    /**
     * 
     * 简要说明：删除角色
     * 编写者：陈骑元（chenqiyuan@toonan.com）
     * 创建时间： 2022年3月2日 下午10:31:29 
     * @param 说明
     * @return 说明
     */
    public boolean removeRole(String roleId) {
	    Query query=WebplusMongo.eq("roleId", roleId);
	    this.roleUserDao.remove(query);
	    this.roleMenuDao.remove(query);
		return this.roleDao.removeById(roleId);
	}
    /**
     * 
     * 简要说明：菜单授权
     * 编写者：陈骑元（chenqiyuan@toonan.com）
     * 创建时间： 2022年3月2日 下午10:35:33 	
     * @param 说明
     * @return 说明
     */
	public boolean batchSaveRoleMenu(String roleId, List<String> menuIdList,String userId) {
	   Query query=WebplusMongo.eq("roleId", roleId);
	   this.roleMenuDao.remove(query);
	   Date now=WebplusUtil.getDateTime();
	   List<RoleMenu> roleMenuList=Lists.newArrayList();
		for(String menuId:menuIdList){
			RoleMenu roleMenu=new RoleMenu();
			roleMenu.setRoleId(roleId);
			roleMenu.setMenuId(menuId);
			roleMenu.setCreateBy(userId);
			roleMenu.setCreateTime(now);
			roleMenuList.add(roleMenu);
		}
		return this.roleMenuDao.batchInsert(roleMenuList);   
	} 
	/**
	 * 
	 * 简要说明：批量用户授权
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月2日 下午10:53:43 
	 * @param 说明
	 * @return 说明
	 */
	public boolean batchSaveRoleUser(String roleId, List<String> userIdList,String createBy) {
		List<RoleUser> roleUserList=Lists.newArrayList();
		Date now=WebplusUtil.getDateTime();
		for(String userId:userIdList){
			RoleUser roleUser=new RoleUser();
			roleUser.setRoleId(roleId);
			roleUser.setUserId(userId);
			roleUser.setCreateBy(createBy);
			roleUser.setCreateTime(now);
			roleUserList.add(roleUser);
		}
		return this.roleUserDao.batchInsert(roleUserList);
	}
	/**
	 * 
	 * 简要说明：撤销用户授权
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月2日 下午10:53:21 
	 * @param 说明
	 * @return 说明
	 */
	public boolean batchRemoveRoleUser(String roleId, List<String> userIdList) {
		if(WebplusUtil.isNotEmpty(userIdList)) {
			 Query query=WebplusMongo.eq("roleId", roleId);
			 for(String userId:userIdList){
				WebplusMongo.eq(query, "userId", userId);
				this.roleUserDao.remove(query);
			}
			 return true;
		}
		
		return false; 
	}

	 /**
	  * 
	  * 简要说明：获取授权菜单
	  * 编写者：陈骑元
	  * 创建时间：2018年12月28日 上午11:01:06
	  * @param 说明
	  * @return 说明
	  */
	 public List<TreeModel> listRoleMenu(String roleId,UserToken userToken){
		 List<Menu> menuList =Lists.newArrayList();
			if(SystemCons.SUPER_ADMIN.equals(userToken.getAccount())){  //如果是超级管理员具有所有的菜单授权
				
				menuList =SystemCache.getCacheMenu(); 
			}else{  //普通管理员只具有他具有菜单授权
			    menuList = SystemCache.getCacheRoleMenu(userToken.getUserId());
			}
		  
			
			List<RoleMenu> roleMenuList=this.findListByRoleId(roleId);
			List<TreeModel> ztreeModelList=Lists.newArrayList();
			TreeModel rootZtree=new TreeModel();
			rootZtree.setId(SystemCons.TREE_ROOT_ID);
			rootZtree.setName(SystemCons.MENU_ROOT_NAME);
			rootZtree.setOpen(true);//展开节点
			if(roleMenuList.size()>0){
				rootZtree.setChecked(true);
			}
			ztreeModelList.add(rootZtree);
			for(Menu menu:menuList){
				TreeModel ztree=new TreeModel();
				String menuId=menu.getMenuId();
				ztree.setId(menuId);
				ztree.setName(menu.getMenuName());
				ztree.setpId(menu.getParentId());
				ztree.setParent(true);
				if(WebplusCons.WHETHER_YES.equals(menu.getIsAutoExpand())){
					ztree.setOpen(true);//展开节点
				}else{
					ztree.setOpen(false);//展开节点
				}
				if(checkRoleMenu(menuId,roleMenuList)){
					ztree.setChecked(true);
				}
				ztree.setChildren(null);
				ztreeModelList.add(ztree);
			}
			
		 return ztreeModelList;
		 
	 }
	 
	 /**
	  * 
	  * 简要说明：通过角色编号找出这个菜单所有权限
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年3月2日 下午11:02:48 
	  * @param 说明
	  * @return 说明
	  */
	 public List<RoleMenu> findListByRoleId(String roleId){
		 Query query=WebplusMongo.eq("roleId", roleId);
		 
		 return this.roleMenuDao.findList(query);
	 }
	/**
	 * 
	 * 简要说明：检查是否需要授权
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年3月2日 下午10:53:03 
	 * @param 说明
	 * @return 说明
	 */
	private boolean checkRoleMenu(String menuId, List<RoleMenu> grantMenuList) {
		for (RoleMenu roleMenu:grantMenuList) {
			 String grantMenuId=roleMenu.getMenuId();
			if (menuId.equals(grantMenuId)) {
				return true;
			}
		}
		return false;

	}
                                   
}
